﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Joel.Vishnu.Modelo.Entidades;
using Joel.Vishnu.Modelo.Enumeradores;
using Joel.Vishnu.Presentacion.Vistas;
using Joel.Vishnu.Presentacion;

namespace Joel.Vishnu.Formularios
{
    public partial class Productos : Form, IProductos
    {
        #region Constructores
        public Productos()
        {
            InitializeComponent();
            presentador = new ProductosPresentador(this);
            grdProductos.AutoGenerateColumns = false;
            grdProductos.DataSource = bsProductos;
        }

        #endregion

        #region Atributos

        ProductosPresentador presentador;
        EnumEstado estado;

        #endregion

        #region Propiedades

        public Int32 ProductoId
        {
            get { return Convert.ToInt32(txtId.Text); }
        }

        public String Nombre
        {
            get { return txtNombre.Text; }
        }

        public String Observacion
        {
            get { return txtObservacion.Text; }
        }

        public Decimal PrecioLista
        {
            get { return numPrecioLista.Value; }
        }

        public Decimal PrecioDistribuidor
        {
            get { return numPrecioDistribuidor.Value; }
        }

        public Int32 ProductoSubCategoriaId
        {
            get { return Convert.ToInt32(cboProductoSubCategoria.SelectedValue); }
        }

        public List<ProductoSubCategoria> ListaProductoSubCategoria
        {
            set
            {
                cboProductoSubCategoria.ValueMember = "Id";
                cboProductoSubCategoria.DisplayMember = "Nombre";
                cboProductoSubCategoria.DataSource = (from item in value
                                                      orderby item.Nombre ascending
                                                      select item).ToList();
            }
        }

        public EnumEstado Estado
        {
            get { return estado; }
        }

        public List<Producto> ListaProductos
        {
            set { bsProductos.DataSource = value; }
        }

        #endregion

        #region Metodos

        public void HabilitarControles()
        {
            try
            {
                lblId.Enabled = !lblId.Enabled;
                lblNombre.Enabled = !lblNombre.Enabled;
                lblObservacion.Enabled = !lblObservacion.Enabled;
                lblPrecioLista.Enabled = !lblPrecioLista.Enabled;
                lblPrecioDistribuidor.Enabled = !lblPrecioDistribuidor.Enabled;
                lblProductoSubCategoria.Enabled = !lblProductoSubCategoria.Enabled;

                txtNombre.Enabled = !txtNombre.Enabled;
                txtObservacion.Enabled = !txtObservacion.Enabled;
                numPrecioLista.Enabled = !numPrecioLista.Enabled;
                numPrecioDistribuidor.Enabled = !numPrecioDistribuidor.Enabled;
                cboProductoSubCategoria.Enabled = !cboProductoSubCategoria.Enabled;

                btnAceptar.Enabled = !btnAceptar.Enabled;
                btnCancelar.Enabled = !btnCancelar.Enabled;
                btnInsertar.Enabled = !btnInsertar.Enabled;
                btnModificar.Enabled = !btnModificar.Enabled;
                btnEliminar.Enabled = !btnEliminar.Enabled;

                grdProductos.Enabled = !grdProductos.Enabled;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        public void LimpiarCampos()
        {
            try
            {
                txtNombre.Text = String.Empty;
                txtObservacion.Text = String.Empty;
                numPrecioLista.Value = 0;
                numPrecioDistribuidor.Value = 0;
                cboProductoSubCategoria.Text = String.Empty;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        public void ActualiarDatos()
        {
            try
            {
                txtId.Text = Convert.ToString(((Producto)bsProductos.Current).Id);
                txtNombre.Text = ((Producto)bsProductos.Current).Nombre;
                txtObservacion.Text = ((Producto)bsProductos.Current).Observacion;
                numPrecioLista.Value = ((Producto)bsProductos.Current).PrecioLista;
                numPrecioDistribuidor.Value = ((Producto)bsProductos.Current).PrecioDistribuidor;
                cboProductoSubCategoria.SelectedValue = ((Producto)bsProductos.Current).ProductoSubCategoria.Id;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        #endregion

        #region Eventos

        private void Productos_Load(Object sender, EventArgs e)
        {
            try
            {
                presentador.Inicialiar();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnInsertar_Click(Object sender, EventArgs e)
        {
            try
            {
                estado = EnumEstado.NUEVO;
                HabilitarControles();
                LimpiarCampos();
                txtNombre.Focus();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnModificar_Click(Object sender, EventArgs e)
        {
            try
            {
                estado = EnumEstado.MODIFICAR;
                HabilitarControles();
                txtNombre.Focus();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnEliminar_Click(Object sender, EventArgs e)
        {
            if (bsProductos.Current != null)
            {
                if (MessageBox.Show("¿Está seguro que desea eliminar el producto seleccionado?", "Eliminar producto", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    try
                    {
                        presentador.Eliminar();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                        presentador.Inicialiar();
                    }
                }
            }
            else
            {
                MessageBox.Show("Debe seleccionar un producto de la lista.");
                presentador.Inicialiar();
            }
        }

        private void btnAceptar_Click(Object sender, EventArgs e)
        {
            try
            {
                presentador.Aceptar();
                HabilitarControles();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnCancelar_Click(Object sender, EventArgs e)
        {
            try
            {
                HabilitarControles();
                presentador.Cancelar();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void grdProductos_SelectionChanged(Object sender, EventArgs e)
        {
            ActualiarDatos();
        }

        #endregion
    }
}
